//
//  UserAccountViewModel.swift
//  weibobbaj
//
//  Created by Tiffany宝 on 16/4/19.
//  Copyright © 2016年 Tiffany. All rights reserved.

// OAuthViewController

import UIKit

class UserAccountViewModel: NSObject {
    
    // 可以将某个ViewModel设计成单例 （不是所有ViewModel都要设计单例）
    static let sharedViewModel = UserAccountViewModel()
    
    // TODO: - ...
//    var finished:(Bool -> ())?
    
    var account: UserAccountModel?
    
    //************ 因为是第二次登录,所以要从沙河中取出 account 的值 *************
    override init() {
        
        super.init()
        account = decodeAccount()
    }
    
    //相当于 get 方法
    var isLogin: Bool{
        
        //1.判断 Access-Token 是否存在
        guard let _ = account?.access_token else{
            
            return false
        }
     
        //2.判断 Access-Token 是否过期
        guard let exptime = account?.expires_time else{
            
            return false
        }
        
        //与当前时间进行判断
        if NSDate().compare(exptime) == .OrderedAscending{
            
            //没过期
            return true
        }
        
        
        return false
    }
    
    func loadAccessToken(code:String,finished:(isSuccess:Bool) -> ()){
        
        /*
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        */
        
        let urlString = "https://api.weibo.com/oauth2/access_token"
        let parameters = [
            "client_id":appkey,
            "client_secret":secret,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":redirect_uri]
        
        NetworkTools.sharedTools.request(RequestMethod.POST, urlString: urlString, parameters: parameters) { (responseObject, error) -> Void in
            
            if error != nil{
                //说明有错误
                print(error)
                finished(isSuccess: false)
                return
            }
            print("请求成功：\(responseObject)")
            
            // 如果 as 是写在 if let 或者 guard 里面，都使用 as? ---------- as? 的第一种使用场景
            guard let dict = responseObject as? [String: AnyObject] else{
                print("后台返回数据的格式不对")
                finished(isSuccess: false)
                return
            }
            /*
            Optional({
            "access_token" = "2.00J1338GOCWDFD53a90e1984GZvx9E";
            "expires_in" = 157679999;
            "remind_in" = 157679999;
            uid = 5901087097;
            })
            */
            //获取授权后 返回的是字典 ----- 在公司里面开发的话，如果数据是字典，尽量要把其转成模型去使用
            let account = UserAccountModel(dic: dict)
            print(account)
            
            // accessToken 获取到了，获取个人信息
            self.loadUserInfo(account,finished:finished)
        }
    }
    
    private func loadUserInfo(account:UserAccountModel,finished:(isSuccess:Bool) -> ()){
        
        let urlStr = "https://api.weibo.com/2/users/show.json"
        let parameters = [
            "access_token":account.access_token ?? "",
            "uid":account.uid ?? ""]
        
        NetworkTools.sharedTools.request( urlString: urlStr, parameters: parameters) { (responseObject, error) -> Void in
            
            if error != nil{
                
                print(error)
                finished(isSuccess: false)
                return
            }
            
            print("请求成功：\(responseObject)")
            
            //判断 responseObject? 是否存在 ,存在即转成字典
            guard let dict = responseObject as? [String: AnyObject] else{
                print("后台返回数据的格式不对")
                finished(isSuccess: false)
                return
            }
            
            // 要用到 字典中的 name 和 avatar_large 参数,所以一起保存为模型
            // 如果等于前面是可选值的话，就使用 as? 如果是必选值，就使用 as! -------- as? 的第二种使用场景
            account.name = dict["name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            print("字典转模型的数据\(account)")
            
            //******------
            self.account = account
            
            //保存用户信息,为了下次用户进入app的时候不用登录
            self.saveAccount(account)
            
            // 代表真正的登录成功 -->
            // TODO: 关闭当前界面
            // 切换控制器
            
//            self.finished!(true)
            // finished 闭包在 2个方法,所以要传2次
            finished(isSuccess: true)
        }
    }
    
    // MARK: - 归档
    private func saveAccount(account:UserAccountModel){
        
        // 归档的路径 ： document路径 + 文件名
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString ).stringByAppendingPathComponent("account.archiver")
        
        print(path)
        
        NSKeyedArchiver.archiveRootObject(account, toFile: path)
        
    }
    
    // MARK: - 解档 若路径不存在,返回nil ---- UserAccountModel?
    private func decodeAccount() -> UserAccountModel?{
        
        //测试解档
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString ).stringByAppendingPathComponent("account.archiver")
        let result = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? UserAccountModel
        //        print(result)
        return result
    }

}
